package xaj.weavingtest.visit;

import polyglot.ast.Node;
import polyglot.ast.NodeFactory;
import polyglot.frontend.Job;
import polyglot.types.SemanticException;
import polyglot.types.TypeSystem;
//import polyglot.visit.ContextVisitor;
import polyglot.visit.ErrorHandlingVisitor;
import polyglot.visit.NodeVisitor;
import xaj.weavingtest.ast.XAJOps;

public class DesugarVisitor extends ErrorHandlingVisitor /*ContextVisitor*/ {

	public DesugarVisitor(Job job, TypeSystem ts, NodeFactory nf) {
		super(job, ts, nf);
	}
	
	/*
	protected NodeVisitor enterCall(Node parent, Node n) throws SemanticException {
		return this;
	}
	*/
	
	protected Node leaveCall(Node old, Node n, NodeVisitor v) throws SemanticException {
		Node m;
		
		/**
		 * Caso em que será executado o método desugar padrão. Neste caso o nó da AST
		 * não é um nó definido pelo usuário.
		 * Para mudar o comportamento, será necessário sobrescrever esse método.
		 */
		if (n.ext() instanceof XAJOps) {
			//System.out.println("Executando método desugar pela extensão: " + n.toString());
			m = ((XAJOps) n.ext()).desugar(/*context(),*/ nodeFactory(), typeSystem());
		} else 
			if (n instanceof XAJOps ){
			/**
			 * Este é o caso em que o nó é definido pelo usuário (nó de extensão)
			 * O método desugar deve ser implementado
			 */
				System.out.println("Executando método desugar do nó de extensão: " + n.toString());
				m = ((XAJOps) n).desugar(/*context(),*/ nodeFactory(), typeSystem());
		} else {
			/**
			 * Este caso não deveria ser usado nunca
			 */
			//System.out.println("Entrei onde não devia: " + n.toString());
			m = n;
		}
		return m;
	}

}
